from threading import Thread
# method 为线程要执行的具体方法

def test1():
    print("多线程1")

def test2():
    print("多线程2")
#
# p1 = Thread(target=test1())
# p2 = Thread(target=test2())
# p1.start()
# p2.start()
#
# p1.join()
# p2.join()

# 多进程
from multiprocessing import Process


# 创建两个进程实例：p1、p2，method 是要执行的具体方法
# p1 = Process(target=test1())
# p2 = Process(target=test2())

# 启动两个进程
# p1.start()
# terminate()停止进程
# p1.terminate()
# p2.start()

# 等待进程 p1、p2 都执行完
# p1.join()
# p2.join()

# TODO 计算密集型任务
import os, time


def task():
    ret = 0
    for i in range(100000000):
        ret *= i


# if __name__ == '__main__':
    # 单线程
    # print('本机为', os.cpu_count(), '核 CPU')
    # start = time.time()
    # for i in range(5):
    #     task()
    # stop = time.time()
    # print('单程耗时 %s' % (stop - start))

    # 多线程
    # arr = []
    # print('本机为', os.cpu_count(), '核 CPU')
    # start = time.time()
    # for i in range(5):
    #     p = Thread(target=task)
    #     arr.append(p)
    #     p.start()
    # for p in arr:
    #     p.join()
    # stop = time.time()
    # print('多线程耗时 %s' % (stop - start))

    # 多进程
    # arr = []
    # print('本机为', os.cpu_count(), '核 CPU')
    # start = time.time()
    # for i in range(5):
    #     p = Process(target=task)
    #     arr.append(p)
    #     p.start()
    # for p in arr:
    #     p.join()
    # stop = time.time()
    # print('计算密集型任务，多进程耗时 %s' % (stop - start))
# TODO 测试结果我们发现，在 CPython 下执行计算密集型任务时，多进程效率最优，多线程还不如单线程

# TODO I/O 密集型任务
def task():
    f = open('tmp.txt','w')
if __name__ == '__main__':
    # 单线程
    # arr = []
    # print('本机为',os.cpu_count(),'核 CPU')
    # start = time.time()
    # for i in range(500):
    #     task()
    # stop = time.time()
    # print('I/O 密集型任务，多进程耗时 %s' % (stop - start))
# 多线程
#     arr = []
#     print('本机为', os.cpu_count(), '核 CPU')
#     start = time.time()
#     for i in range(500):
#         p = Thread(target=task)
#         arr.append(p)
#         p.start()
#     for p in arr:
#         p.join()
#     stop = time.time()
#     print('I/O 密集型任务，多进程耗时 %s' % (stop - start))
# 多进程
    arr = []
    print('本机为', os.cpu_count(), '核 CPU')
    start = time.time()
    for i in range(500):
        p = Process(target=task)
        arr.append(p)
        p.start()
    for p in arr:
        p.join()
    stop = time.time()
    print('I/O 密集型任务，多进程耗时 %s' % (stop - start))
# TODO 多线程效率优于多进程，单线程与多线程效率接近
'''
对于一个运行的程序来说，随着 CPU 的增加执行效率必然会有所提高，
因此大多数时候，一个程序不会是纯计算或纯 I/O，所以我们只能相对的去看一个程序是计算密集型还是 I/O 密集型
'''